home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
CRS
/
crs55.d81
/
bincmp.c
< prev
next >
Wrap
Text File
|
2009-10-10
|
4KB
|
162 lines
/*
╨ROGRAM: BINCMP - COMPARE BINARY FILES
╓ERSION: 1.0 01/31/86
┴UTHOR: ═ARK ╥. ╥INFRET
╙YNOPSIS:
$ BINCMP FILE1 FILE2 (╙┼╤ ╞ILES)
$ BINCMP FILE1,P FILE2,P (╨╥╟ FILES)
╞ILENAMES MAY ALSO CONTAIN DEVICE NUMBER SPECIFICATION (E.G. #9:FILE1).
─ESC.:
┬INCMP COMPARES TWO FILES (╙┼╤,╨╥╟) AS BINARY DATA, REPORTING
DIFFERENCES TO STANDARD OUTPUT.
╫RITTEN FOR ├OMMODORE ├64 W/├-╨OWER
╬╧╘┼: ╘HIS PROGRAM USES A MODIFIED FREAD ROUTINE (╥AY ┌ARLING) WHICH
RETURNS THE NUMBER OF ELEMENTS READ RATHER THAN THE SIMPLE 1 OR
0 WHICH THE NON-STANDARD ├-╨OWER FREAD RETURNS. ╘HE BUFFERING
ACCOMPLISHED BY USING FREAD PROVIDES A SIGNIFICANT IMPROVEMENT
IN PERFORMANCE (VS. FGETC).
*/
#INCLUDE <STDIO.H>
CHAR *MALLOC();
#DEFINE ┬╒╞╙╔┌ 254*4 /* SIZE OF FOUR FULL SECTORS */
#DEFINE ═┴╪┼╥╥ 200 /* MAXIMUM MISMATCHES ALLOWED */
CHAR *BUF1,*BUF2;
UNSIGNED BIAS,ERRCNT,I,LAST,LAST1,LAST2;
╞╔╠┼ *FIL1;
╞╔╠┼ *FIL2;
/* ╬OTE: FUNCTIONAL DESIGN COULD HAVE BEEN CLEANER, BUT THE PROGRAM IS
SMALL - SO WHY BOTHER?
*/
MAIN(ARGC,ARGV)
CHAR **ARGV;
█
STATIC CHAR *NOTOPEN = "├AN'T OPEN %S\N";
STATIC CHAR *LONGER = "%S IS LONGER!\N\N";
IF (ARGC != 3) HELP();
BUF1 = MALLOC(┬╒╞╙╔┌); /* ─YNAMIC ALLOCATION SAVES ON PROGRAM FILE SIZE */
BUF2 = MALLOC(┬╒╞╙╔┌);
IF ((FIL1=OPENFILE(ARGV[1],"R"))==╬╒╠╠ ▀▀ FERROR())
█
PRINTF(NOTOPEN,ARGV[1]);
EXIT();
▌
IF ((FIL2=OPENFILE(ARGV[2],"R"))==╬╒╠╠ ▀▀ FERROR())
█
PRINTF(NOTOPEN,ARGV[2]);
EXIT();
▌
PRINTF(" %-16S %-16S\N\N",ARGV[1],ARGV[2]);
BIAS = 0;
FOR (ERRCNT = 0 ; ERRCNT < 20 ;)
█
LAST1 = FREAD(BUF1,1,┬╒╞╙╔┌,FIL1); /* READ FROM FILE 1 */
LAST2 = FREAD(BUF2,1,┬╒╞╙╔┌,FIL2); /* READ FROM FILE 2 */
LAST = LAST1;
IF (LAST1 != LAST2) █
IF (LAST1 > LAST2) █
LAST = LAST2;
PRINTF(LONGER,ARGV[1]);
▌
ELSE
PRINTF(LONGER,ARGV[2]);
▌
FOR (I=0; I<LAST; I++) █
IF (BUF1[I] != BUF2[I]) █
ERRCNT++;
PRINTF("%04X %02X %02X\N",BIAS+I,BUF1[I],BUF2[I]);
IF (ERRCNT > ═┴╪┼╥╥) █
PUTS("\N╘OO MANY ERRORS!\N");
BREAK;
▌
▌
▌
IF (LAST<┬╒╞╙╔┌) BREAK;
BIAS += ┬╒╞╙╔┌;
▌
IF (LAST1==LAST2 && ERRCNT==0)
PUTS("\N╞ILES MATCH.");
ELSE █
IF (ERRCNT)
PRINTF("\N╘HERE WERE AT LEAST %D MISMATCHES.\N",ERRCNT);
ELSE
PUTS("\N╘HERE WERE NO MISMATCHES TO THIS POINT.");
▌
▌
/* ╧PEN A FILE, ALLOWING DEVICE SPECIFICATION. */
OPENFILE(NAME,HOW)
CHAR *NAME,*HOW;
█
CHAR *XNAME;
CHAR C;
UNSIGNED DVC;
XNAME = NAME; /* COPY POINTER */
DVC = 8; /* DEFAULT IS DEVICE 8 */
IF ((C=*XNAME) == '#') █
XNAME++;
IF (((C=*XNAME) == '8') ▀▀ ((C=*XNAME) == '9')) █
XNAME++;
DVC = (8 + (C - '8'));
IF (*XNAME==':') XNAME++;
ELSE █
PRINTF("MISSING ':' IN DEVICE SPECIFICATION\N%S\N",XNAME);
RETURN ╬╒╠╠;
▌
▌
ELSE █
PRINTF("ILLEGAL DEVICE NUMBER:\N%S\N",XNAME);
RETURN ╬╒╠╠;
▌
▌
DEVICE(DVC);
RETURN (FOPEN(XNAME,HOW));
▌
/* ┼XPLAIN PROGRAM TO USER */
HELP()
█
PUTS("╘HIS PROGRAM COMPARES 2 FILES AS BINARY");
PUTS("DATA. ╔T CAN BE USED TO COMPARE EITHER");
PUTS("╙┼╤ OR ╨╥╟ FILES (OR ONE OF EACH).");
PUTS("╥EMEMBER TO SUFFIX ╨╥╟ FILENAMES WITH");
PUTS("',P'. ┴LSO, THE DEVICE NUMBER FOR EACH");
PUTS("FILE MAY BE SPECIFIED.");
PUTS("╒SAGE: $ BINCMP FILE1 FILE2");
PUTS(" $ BINCMP #8:FILE1,P #9:FILE2,P");
PUTS("\N╘HIS PROGRAM IS CURRENTLY HARDWIRED TO");
PRINTF("ABORT AFTER %D ERRORS.\N",═┴╪┼╥╥);
PUTS("╥EMEMBER, WHEN COMPARING ╨╥╟ FILES THAT");
PUTS("THE ADDRESS REPORTED SHOULD BE ADJUSTED");
PUTS("BY LOAD ADDRESS MINUS 2 (LA-2).");
EXIT();
▌